package vip.idiy.anwei_android_iot.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * ClassName SocketUtil
 * describe: Socket工具类
 * Created: 勇
 * Email:118085890@qq.com
 * Version: 1.0
 * Create in 11:24 2023/4/23
 */
public class SocketUtil {
    private Socket mSocket; // 声明Socket对象
    private BufferedReader mIn; // 声明BufferedReader对象
    private PrintWriter mOut; // 声明PrintWriter对象
    private boolean mIsConnected = false; // 声明连接状态
    private ExecutorService mExecutorService = Executors.newSingleThreadExecutor(); // 声明线程池

    private OnWifiDisconnectedListener mOnWifiDisconnectedListener; // 声明wifi掉线监听器


    public interface OnConnectListener { // 声明连接监听器接口
        void onConnectSuccess(); // 连接成功回调
        void onConnectFail(); // 连接失败回调
    }

    public interface OnReceiveListener { // 声明接收监听器接口
        void onReceive(String data); // 接收数据回调
    }

    public interface OnWifiDisconnectedListener { // 声明wifi掉线监听器接口
        void onWifiDisconnected(); // wifi掉线回调
    }

    public boolean isConnected() { // 判断是否连接
        return mIsConnected;
    }

    public void setOnWifiDisconnectedListener(OnWifiDisconnectedListener listener) { // 设置wifi掉线监听器
        mOnWifiDisconnectedListener = listener;
    }

    /**
     * 连接方法
     * @param ip 服务器IP地址
     * @param port 服务器端口号
     * @param listener 连接监听器
     */
    public void connect(final String ip, final int port, final OnConnectListener listener) {
        // 在线程池中执行连接操作
        mExecutorService.execute(() -> {
            try {
                mSocket = new Socket(ip, port); // 创建Socket对象
                mIn = new BufferedReader(new InputStreamReader(mSocket.getInputStream())); // 获取输入流
                mOut = new PrintWriter(mSocket.getOutputStream(), true); // 获取输出流
                mIsConnected = true; // 设置连接状态为true
                if (listener != null) {
                    listener.onConnectSuccess(); // 回调连接成功方法
                }
            } catch (IOException e) {
                e.printStackTrace();
                if (listener != null) {
                    listener.onConnectFail(); // 回调连接失败方法
                }
            }
        });
    }

    /**
     * 断开连接方法
     */
    public void disconnect() {
        try {
            mSocket.close(); // 关闭Socket连接
            mIsConnected = false; // 设置连接状态为false
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送数据方法
     * @param data 待发送的数据
     */
    public void send(String data) {
        if (mSocket != null && mSocket.isConnected()) { // 判断Socket是否连接
            mOut.println(data); // 发送数据
        }
    }

    /**
     * 接收数据方法
     * @param listener 接收监听器
     */
    // public void receive(final OnReceiveListener listener) {
    //     // 在线程池中执行接收操作
    //     mExecutorService.execute(() -> {
    //         while (mIsConnected) { // 循环接收数据
    //             try {
    //                 String data = mIn.readLine(); // 读取数据
    //
    //                 if (data != null && listener != null) {
    //                     listener.onReceive(data); // 回调接收数据方法
    //                 }
    //             } catch (IOException e) {
    //                 e.printStackTrace();
    //                 if (mIsConnected) {
    //                     mIsConnected = false; // 设置连接状态为false
    //                     if (mOnWifiDisconnectedListener != null) {
    //                         mOnWifiDisconnectedListener.onWifiDisconnected(); // 回调wifi掉线方法
    //                     }
    //                 }
    //             }
    //         }
    //     });
    // }

     public void receive(final OnReceiveListener listener) {
        // 在线程池中执行接收操作
        mExecutorService.execute(() -> {
            while (mIsConnected) { // 循环接收数据
                try {
                    StringBuilder sb = new StringBuilder();
                    char c;
                    while ((c = (char) mIn.read()) != '\n') { // 读取数据直到遇到换行符
                        sb.append(c);
                    }
                    String data = sb.toString();

                    if (data != null && listener != null) {
                        listener.onReceive(data); // 回调接收数据方法
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    if (mIsConnected) {
                        mIsConnected = false; // 设置连接状态为false
                        if (mOnWifiDisconnectedListener != null) {
                            mOnWifiDisconnectedListener.onWifiDisconnected(); // 回调wifi掉线方法
                        }
                    }
                }
            }
        });
    }
}